import axios from "axios";
import router from "../router";
import {ElMessage} from "element-plus";

// 设置 Axios 的默认基础 URL
axios.defaults.baseURL = import.meta.env.VITE_APP_API_URL;

// 创建 Axios 实例
const http = axios.create({
    timeout: 5000, headers: {
        'Content-Type': 'application/json'
    }
});

// 请求拦截器
http.interceptors.request.use(config => {
    if (localStorage.getItem("token")) {
        config.headers["token"] = localStorage.getItem("token");
    }
    return config;
}, error => {
    return Promise.reject(error);
});

// 响应拦截器
http.interceptors.response.use(response => {
    const res = response.data;
    if (res.code === 200) {
        return res;
    }
    // 401: 未登录或token过期
    if (res.code === 401) {
        // 清除本地存储的token
        localStorage.removeItem("token");
        // 避免重复跳转
        if (router.currentRoute.value.path !== "/login") {
            ElMessage.warning("登录已过期，请重新登录");
            router.push("/login");
        }
        return Promise.reject(new Error("登录已过期"));
    }
    // 其他错误
    if (res.msg) {
        ElMessage.error(res.msg);
    }
    return Promise.reject(new Error(res.msg || "未知错误"));
}, error => {
    // 处理HTTP状态码错误
    if (error.response) {
        const { status, data } = error.response;
        const serverMsg = data && (data.msg || data.message);
        if (status === 401) {
            // 处理401未授权错误
            localStorage.removeItem("token");
            if (router.currentRoute.value.path !== "/login") {
                ElMessage.warning("登录已过期，请重新登录");
                router.push("/login");
            }
            return Promise.reject(error);
        }
        if (status === 404) {
            // 不显示404错误提示
            return Promise.reject(error);
        }
        if (status === 409) {
            // 冲突（例如余额不足、状态已变化等）
            ElMessage.warning(serverMsg || "请求冲突，请刷新后重试");
            return Promise.reject(new Error(serverMsg || "请求冲突"));
        }
    }
    
    // 网络错误或其他错误
    if (error.code !== 'ERR_CANCELED') { // 忽略取消的请求
        ElMessage.error(error.message || "网络错误，请检查网络连接");
    }
    return Promise.reject(error);
});

// 只在开发环境下打印环境变量
if (import.meta.env.DEV) {
    console.log("开发环境已启动");
}

export default http;

